package com.mallcai.bigdata.ladon.datasource;

import com.mallcai.bigdata.ladon.dpl.vo.DataType;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.sql.ResultSet;
import java.util.List;

/**
 * described : 数据查询结果处理工具类
 * Created by DiLong on 2017-12-20 17:18.
 * Modify:
 */
@Slf4j
public final class ResultSetDataTool {

    public static Object getValue(ResultSet rs, String col, DataType dt) throws Exception {
        Object columnValue;
        try {

            if (dt == DataType.BOOLEAN) {
                columnValue = rs.getBoolean(col);
            } else if (dt == DataType.INTEGER) {
                columnValue = rs.getInt(col);
            } else if (dt == DataType.LONG) {
                columnValue = rs.getLong(col);
            } else if (dt == DataType.DOUBLE) {
                columnValue = rs.getDouble(col);
            } else if (dt == DataType.STRING) {
                columnValue = rs.getString(col);
            } else if (dt == DataType.FLOAT) {
                columnValue = rs.getFloat(col);
            } else if (dt == DataType.BIG_DECIMAL) {
                columnValue = rs.getBigDecimal(col);
            } else if (dt == DataType.DATE) {
                columnValue = DateFormatUtils.format(rs.getDate(col), "yyyy-MM-dd");
            } else if (dt == DataType.TIME) {
                columnValue = DateFormatUtils.format(rs.getTime(col), "HH:mm:ss");
            } else if (dt == DataType.DATETIME) {
                //todo 目前为了修复bug,将DATETIME字段通过getTimestamp()方法来获取值
                columnValue = DateFormatUtils.format(rs.getTimestamp(col), "yyyy-MM-dd HH:mm:ss");
            } else {
                columnValue = rs.getObject(col);
            }
        } catch (Exception e) {
            //            log.error("获取相应数据类型错误!, dt={}, val={}", dt, rs.getObject(i), e);
            columnValue = rs.getObject(col);
        }

        return columnValue;
    }


    public static DataType getDataType(String javaType) {
        if (StringUtils.equals(javaType, Boolean.class.getName())) {
            return DataType.BOOLEAN;
        } else if (StringUtils.equals(javaType, Integer.class.getName()) ||
                StringUtils.equals(javaType, java.math.BigInteger.class.getName())) {
            return DataType.INTEGER;
        } else if (StringUtils.equals(javaType, Long.class.getName())) {
            return DataType.LONG;
        } else if (StringUtils.equals(javaType, Double.class.getName())) {
            return DataType.DOUBLE;
        } else if (StringUtils.equals(javaType, String.class.getName())) {
            return DataType.STRING;
        } else if (StringUtils.equals(javaType, Float.class.getName())) {
            return DataType.FLOAT;
        } else if (StringUtils.equals(javaType, java.math.BigDecimal.class.getName())) {
            return DataType.BIG_DECIMAL;
        } else if (StringUtils.equals(javaType, java.sql.Date.class.getName())) {
            return DataType.DATE;
        } else if (StringUtils.equals(javaType, java.sql.Time.class.getName())) {
            return DataType.TIME;
        } else if (StringUtils.equals(javaType, java.sql.Timestamp.class.getName())){
            return DataType.DATETIME;
        } else {
            return DataType.OBJECT;
        }
    }


    public static boolean contains(List<String> columns, String column) {
        if (columns == null || columns.isEmpty() || StringUtils.isBlank(column)) {
            return false;
        }

        for (String c : columns) {
            if (StringUtils.equals(c, column)) {
                return true;
            }
        }

        return false;
    }
}
